package com.example.study1;

import java.util.*;
/*List接口重要注意事项
泛型使用：始终使用泛型来保证类型安全
初始容量：对于 ArrayList，如果知道大概元素数量，可以设置初始容量避免频繁扩容
接口编程：使用 List 接口声明变量，提高代码的灵活性
并发修改：不要在 foreach 循环中直接修改集合结构
不可变集合：使用 Collections.unmodifiableList() 创建不可变视图
线程安全：在多线程环境中使用同步包装或并发集合*/
public class ListBestPractices {
    public static void main(String[] args) {
        // 1. 使用泛型指定元素类型（保证类型安全，避免运行时类型转换错误）
        List<String> safeList = new ArrayList<>();  // 正确：使用泛型，编译时检查类型安全
        // List unsafeList = new ArrayList();       // 错误：不使用泛型，可能引发ClassCastException

        // 2. 初始容量设置（对于ArrayList优化性能）
        List<String> largeList = new ArrayList<>(1000);  // 预设初始容量为1000，避免频繁扩容影响性能

        // 3. 使用接口类型声明变量（面向接口编程，提高代码灵活性）
        List<String> list = new ArrayList<>();        // 好：面向接口编程，易于更换实现
        // ArrayList<String> list = new ArrayList<>(); // 不够灵活：绑定到具体实现类

        // 4. 并发修改异常示例和正确处理方法
        List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

        // 错误示例：在增强for循环中直接删除元素会导致 ConcurrentModificationException
        /*
        for (Integer num : numbers) {
            if (num == 3) {
                numbers.remove(num);  // 抛出 ConcurrentModificationException！
            }
        }
        */

        // 正确方法：使用迭代器的 remove 方法安全删除元素
        Iterator<Integer> iterator = numbers.iterator();  // 获取列表的迭代器
        while (iterator.hasNext()) {                      // 遍历列表
            Integer num = iterator.next();                // 获取当前元素
            if (num == 3) {
                iterator.remove();  // 使用迭代器的 remove 方法安全删除当前元素
            }
        }
        System.out.println("安全删除后: " + numbers);

        // 5. 使用Collections工具类创建不可修改的列表（只读视图）
        List<String> unmodifiableList = Collections.unmodifiableList(
                numbers.stream()                    // 将数字列表转换为流
                        .map(String::valueOf)        // 将每个数字转换为字符串
                        .toList()                    // 收集为列表
        );
        // 尝试修改不可修改列表会抛出 UnsupportedOperationException：
        // unmodifiableList.add("new");

        // 6. 创建同步列表（线程安全）
        List<String> syncList = Collections.synchronizedList(new ArrayList<>());
        // syncList 是线程安全的，可以在多线程环境中安全使用
    }
}